// 29/01/2008
// Daniel Fleischman
// Arquivo exemplo, para testar as tecnologias. Alta volatilidade

#include "evento/enum_eventos.h"
#include "evento/gerenciador.h"
#include "evento/tratadores_prontos.h"

#include "SDL.h"
#include "SDL_gfxPrimitives.h"

#include "tarefa/gerenciador.h"
#include "tarefa/tarefas_prontas.h"

#include "teclado/teclado.h"

#include "porte_sdl/evento.h"

#include "video/tela.h"

#include <boost/bind.hpp>
#include <boost/ref.hpp>
#include <stdio.h>
#include <algorithm>

using namespace std;
using namespace boost;

bool sair = false;
double x = 0, y = 0;
double cor;
int main()
{
  SDL_Init(SDL_INIT_VIDEO);
  SDL_WM_SetCaption("Daniel", "Daniel");
  TECLA_APERTA(SDLK_ESCAPE, new evento::muda_valor<bool>(sair, true));
  TECLA_BAIXO(SDLK_RIGHT, new tarefa::linear<double>(x, 1./20));
  TECLA_BAIXO(SDLK_LEFT, new tarefa::linear<double>(x, -1./20));
  teclado::iterator_tarefa it = 
      TECLA_BAIXO(SDLK_UP, new tarefa::linear<double>(y, -1./20));
    TECLA_BAIXO(SDLK_DOWN, new tarefa::linear<double>(y, 1./20));
  TECLA_BAIXO(SDLK_p, new tarefa::linear<double>(cor, 256./1000.));
  // Quando a tecla 'q' for apertada, desassocia a tecla de cima.
  // Ao ser apertada, a funcao TECLA.retira_baixo(it) eh chamada :D
    TECLA_APERTA(SDLK_q, new evento::func_tratador_simples(
                             bind(&teclado::teclado::retira_baixo,
                             ref(TECLA), it)));
  GE.cadastra(::evento::FECHAR_TELA, new evento::muda_valor<bool>(sair, true));
  TELA.inic(640, 480, 0, SDL_DOUBLEBUF | SDL_HWSURFACE);
  int antes = SDL_GetTicks();
  int conta = 0;
  ::porte_sdl::evento::getInstancia();
  while (!sair)
  {
    GT.roda();
    if ( cor < 0. ) cor += 256.;
    int icor = (int) cor;
    boxRGBA(&TELA_S, 0, 0, 640, 480, icor % 256, icor % 256, icor % 256, 255);
    boxRGBA(&TELA_S, (int)x, (int)y, (int)x + 50, (int)y + 50, 255, 0, 0, 255);
    conta++;
  }
  int depois = SDL_GetTicks();
  SDL_Quit();
  printf("%d/%d = %f\n", depois-antes, conta, (double)(depois-antes)/conta);
  return 0;
}
